Une fois que vous avez compris les mouvements de Sprites, vous voudrez sans doute commencer à interagir avec ces Sprites. Comment les déplacer, et avec quoi ? Si vous avez votre Amiga depuis plus de dix minutes, vous êtes habitué à avoir un joystick dans un port et une souris dans l'autre, ce sont donc évidemment les premiers choix de dispositifs d'entrée. Ensuite, il y a le clavier, parfait pour les jeux type Tetris, ou une option pour ceux qui détestent les joysticks. (Ils existent, je vous assure. Principalement d'anciens utilisateurs de PC !)
Vous interagissez avec les programmes AMOS en utilisant le clavier, la souris et le joystick, et bien que le clavier soit facile (à condition de connaître le BASIC), faire comprendre à l'ordinateur ce que vous voulez en utilisant la souris et le clavier est plus difficile à maîtriser. Jusqu'à maintenant.
HIDE
est la première commande qui vient à l'esprit, et c'est une commande de contrôle de la souris assez simple qui n'a rien à voir avec le mouvement des objets, mais qui, comme nous allons le voir dans un instant, a quelque chose à offrir au programmeur de mouvements à la souris. Cette commande masque le pointeur de la souris, et les raisons pour lesquelles vous voudriez faire cela sont multiples. Principalement, c'est pour libérer l'écran pour une belle image sans permettre à l'utilisateur d'être distrait par l'envie de cliquer sur quelque chose. Si le pointeur de la souris n'est pas utilisé, mais qu'à la place vous utilisez un personnage qui est en fait un Sprite (comme une image numérisée d'une main humaine, par exemple), alors évidemment vous ne voudrez pas que l'ancien pointeur reste affiché à l'écran, n'est-ce pas ?
Ainsi, HIDE
renvoie le pointeur. Pour le faire revenir, utilisez simplement la commande SHOW
, donc une structure typique ressemblerait à ceci :
Screen Open 0,640,256,4,Hires Load Iff "charger une image en hires ici" Hide Centre "" Wait Key Show Centre " " Wait Key
Une autre commande utile de la souris est CHANGE MOUSE
. Elle permet de changer la forme du pointeur de la souris pour une autre forme prédéfinie ou même l'une de vos propres créations. Voici comment utiliser CHANGE MOUSE
:
Change Mouse 1
où le chiffre 1 peut être remplacé par n'importe quel nombre de 1 à 3. Les formes prédéfinies du pointeur sont :
Et si vous choisissez 4, alors le pointeur de la souris sera pris depuis votre banque de Sprites. Ce n'est toutefois pas si simple, car le numéro du Sprite est dérivé en soustrayant 3 au nombre donné. Ainsi, par exemple :
Change Mouse 4
donne le Sprite 1 de la banque actuelle, et :
Change Mouse 5
donne le Sprite 2, et ainsi de suite.
Voici un exemple de programme de lecture de la souris :
Rem * Mousing around.AMOS * Rem Print "Mouse pointer on" Wait Key Hide Cls Print "Mouse pointer off!" Wait Key Show Cls Change Mouse 3 Print "Mouse back again, but altered" Print "Move mouse and press button" Cls Proc _CHECKMOUSE End Procedure _CHECKMOUSE Do Home X1=X Mouse : Y1=Y Mouse Print "Mouse location = ";X1,Y1 K=Mouse Key If K=0 Then K$="None" If K=1 Then K$="Left" If K=2 Then K$="Right" Print "Mouse key pressed = ";K$ Loop End Proc
Contrôle d'un Bob avec la souris :
Rem * Mouse follow.AMOS * Rem Screen Open 0,320,256,32,Lowres Flash Off : Hide : Cls 0 Load "df3:sprite_600/space/ship3.abk" Get Sprite Palette Double Buffer Do X1=X Mouse : Y1=Y Mouse Bob 1,X1-150,Y1-50,1 Loop
Limiter les mouvements de la souris :
Rem * Mouse Limit.AMOS * Rem Curs Off : Cls 0 Ink 7 Bar 0,0 To 319,150 Ink 2 Box 0,0 To 319,150 Box 100,100 To 200,50 Pen 0 : Paper 7 Locate 0,1 Centre "* BOUTON GAUCHE limite de la souris *" Locate 0,3 Centre "* BOUTON DROIT pas de limites *" Do If Mouse Key=1 Limit Mouse X Hard(0,100),Y Hard(0,100) To X Hard(0,200),Y Hard(0,50) X Mouse=X Hard(0,150) : Y Mouse=Y Hard(0,70) End If If Mouse Key=2 Then Limit Mouse Loop
Remarquez l'utilisation de X HARD
et Y HARD
pour positionner précisément la tête du pointeur.
Rem * Retch-As-Ketch.AMOS * Rem Curs Off : Cls 0 Paper 0 Pen 3 : Centre "R e t c h - A s - K e t c h" Locate ,4 : Pen 4 : Centre "Appuyez sur la touche 's' pour sauvegarder un dessin" Locate ,6 : Pen 2 : Centre "Bouton droit de la souris pour effacer l'écran" Locate ,24 : Pen 1 : Centre "Appuyez sur une touche pour commencer" Wait Key : Cls 0 Y Mouse=X Screen(160) : X Mouse=Y Screen(100) Do X=X Mouse : Y=Y Mouse M=Mouse Key I$=Inkey$ If M=1 Then Plot X Screen(0,X),Y Screen(0,Y),2 If M=2 Then Cls 0 If I$="s" Then SAVIT Loop Procedure SAVIT F$=Fsel$("*.IFF","","Sauvegarder votre dessin") Save Iff F$ End Proc
Et ainsi, nous passons au joystick, qui est lu d'une manière tout aussi directe. Évidemment, la principale différence entre le joystick et la souris est que la souris a une coordonnée sur l'écran, tandis que le joystick n'a que huit directions et un bouton de tir.
Il existe des méthodes de lecture du joystick en AMAL, voire en Autotest, mais nous verrons cela dans les chapitres 12 et 13. Pour l'instant, concentrons-nous sur les méthodes de lecture du joystick via AMOS lui-même.
La commande Joy
renvoie une valeur indiquant l'état du joystick. Regardons ce segment de code :
Do Bob 1,X1,Y1,I J=Joy(1) And 15 Add X1,X(J),10 To 50 Add Y1,Y(J),10 To 20 Exit If Joy(1)>15 Loop
Contentez-vous de l'examiner, ne le tapez pas car il ne fonctionnera pas tel quel. Cet exemple nécessite que vous configuriez des instructions DIM
, etc. Mais il montre que vous pouvez lire le port de joystick 1 et passer l'information à une commande de déplacement de Bob pour le faire se déplacer sur l'écran.
En plus d'utiliser la commande complète Joy
, vous pouvez interroger chaque direction individuellement avec les commandes Jup
, Jdown
, Jleft
et Jright
, ainsi que Fire
pour vérifier si le bouton de tir est pressé.
Essayez cet exemple qui vous donnera une bonne idée :
Rem * Joystick Tester * Rem Do If Jleft(1) Then Print "Gauche" If Jright(1) Then Print "Droite" If Jup(1) Then Print "Haut" If Jdown(1) Then Print "Bas" If Fire(1) Then Print "==TIR!==" Loop
La direction est importante pour l'animation comme nous l'avons vu dans le chapitre sur la création de Sprites. Voici comment c'est fait :
Rem * Directional Joystick.AMOS * Rem Flash Off : Hide : Curs Off : Cls 0 Load "df0:sprite_600/vehicle/superbik.abk" Ink 2 Polygon 100,75 To 200,75 To 319,200 To 0,200 To 100,75 Ink 1 Polygon 150,75 To 155,75 To 159,100 To 155,100 Polygon 156,110 To 164,150 To 170,150 To 159,110 Polygon 174,159 To 185,200 To 176,200 To 170,159 Locate ,3 Paper 0 Centre "Use the joystick to lean the bike!" Double Buffer Get Sprite Palette X1=100 : Y1=100 : I=11 Bob 1,X1,Y1,I Do If Jleft(1) Then Dec I If I<1 Then I=1 If Jright(1) Then Inc I If I>20 Then I=20 If I>11 Then A=25 If I<=11 Then A=0 Bob 1,X1+A,Y1,I Wait Vbl Loop
Vous pouvez transmettre les mouvements du joystick au pointeur de la souris, ou les utiliser pour déplacer un écran :
Rem * Joystick Screen Move.AMOS * Rem Screen Open 1,320,256,32,Lowres Flash Off : Curs Off : Hide : Cls Load Iff "df0:iff/amospic.iff",1 Screen Display 1,X Hard(0,0),Y Hard(0,0),320,256 X=0 : Y=0 Screen Copy 0,0,0,319,100 To 0,639,0 Do If Joy(1)=%100 Then X=X-6 If Joy(1)=%1000 Then X=X+6 Screen Offset 1,X,0 Wait Vbl Loop
Pour utiliser le clavier, on peut utiliser INKEY$
:
Do X$=Inkey$ If X$<>"" Then Print X$ Loop
Ou pour détecter une touche spéciale avec son scancode :
Rem * Scancode.AMOS * Rem Screen Open 0,640,256,16,Hires Hide : Paper 0 : Cls 0 Do While KEE$="" KEE$=Inkey$ Wend If Asc(KEE$)=0 Then Print "**Spéciale touche !**" Print "Scancode pour la touche :";Scancode KEE$="" Loop
Et pour finir, un vrai petit jeu AMOS :
Rem * Blaster.AMOS * Rem Hide : Curs Off : Flash Off Unpack 6 To 0 Dim ALIEN(5) For I=1 To 5 Sam Play 15,1,20000 Wait 5 Next I Wait 25 Track Loop On Track Play 3 Repeat Until Joy(1) Track Stop Flash Off Screen Open 1,320,200,16,Lowres Double Buffer Get Sprite Palette SCORE=0 NEWGAME: Cls 0 LIVES=3 : BUGS=5 : SX=50 : SY=100 : AX=320 : AY=30 MISSFLAG=0 : SHIPFLAG=0 : ALIENFLAG=0 Curs Off Cls 0 Locate 15,10 : Paper 0 : Print "Score: ";SCORE Wait 100 Cls 0 Ink 15 For Z=1 To 50 Plot Rnd(320),Rnd(200) Next Z For Z=1 To 5 ALIEN(Z)=0 Next Z Repeat If Jleft(1) and SX>30 Then SX=SX-2 If Jright(1) and SX<320 Then SX=SX+2 If Jup(1) and SY>0 Then SY=SY-2 If Jdown(1) and SY<199 Then SY=SY+2 Bob 1,SX,SY,1 If SHIPFLAG=1 Then Bob Off 1 : SX=50 : SY=100 Wait Vbl For J=1 To 5 If ALIEN(J)=1 Then Goto SKIP Bob J+2,AX,AY+SPACE,3 SKIP: SPACE=SPACE+30 If SPACE>120 Then SPACE=0 Next J AX=AX-2 If AX=-30 Then ALIENFLAG=0 If AX=-30 Then SHIPFLAG=0 If AX=-30 Then AX=320 If Fire(1) and MISSFLAG=0 Then Sam Play 1 MISSFLAG=1 Bob 2,SX,SY,2 MX=SX : MY=SY End If If MISSFLAG=1 Then Add MX,5 Bob 2,MX,MY,2 If MX>SX+100 Then Bob Off 2 : MISSFLAG=0 End If If Bob Col(1,3 To 7) and SHIPFLAG=0 Then Gosub _BOOM If Bob Col(2,3 To 7) and ALIENFLAG=0 Then Gosub _ABOOM Until LIVES=0 or BUGS=0 Wait 25 Sam Play 3 Wait 50 Sam Play 15,1,1500 Wait 100 For Z=1 To 7 Bob Off Z Next Z Goto NEWGAME _BOOM: Boom SHIPFLAG=1 Bob 1,SX,SY,4 Wait 10 LIVES=LIVES-1 Return _ABOOM: Sam Play 2 ALIENFLAG=1 Bob Off 2 D=0 For A=3 To 7 If Col(A) Then D=A Next A If D=0 Then _OFFSET=0 If D=4 Then _OFFSET=30 If D=5 Then _OFFSET=60 If D=6 Then _OFFSET=90 If D=7 Then _OFFSET=120 Bob D,AX,AY+_OFFSET,4 ALIEN(D-2)=1 Wait 10 Bob Off D BUGS=BUGS-1 SCORE=SCORE+100 Return
Vous pouvez examiner les fichiers chargés dans le programme en allant en mode direct et en tapant LISTBANK
.
Vous avez besoin d'une animation rapide, et vous n'avez pas de compilateur ? Dans ce cas, la prochaine étape de ce voyage doit être l'AMOS Animation Language. Oui, il est temps pour une séance de AMAL.